package com.wpre.vampiremq.mqserver.core;

import lombok.Data;

import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * Description:表示一个传递的消息
 * User: LianBao
 * Date: 2025-01-11
 * Time: 15:47
 */

public class Message implements Serializable {
    //消息的属性部分
    private BasicProperties basicProperties = new BasicProperties();

    //消息的正文部分
    private byte[] body;


    //Message如果持久化的话,后续会存储到文件中
    //一个文件会存储多条消息,所以需要有消息的起始位置和终止位置,约定[offsetBeg,offsetEnd)
    //offsetBeg offsetEnd不需要序列化,加上transient关键字
    private transient long offsetBeg = 0;//消息的数据开头离文件开头位置的偏移量(单位字节)
    private transient long offsetEnd = 0;//消息的数据结尾离文件开头位置的偏移量(单位字节)

    //表示该消息在文件中是否是有效消息(相当于逻辑删除),针对文件中的消息,如果删除使用的是逻辑删除
    //0x1表示有效,0x0表示无效(使用byte的原因:byte在文件中的大小不好说,所以用byte,一个字节一个字节表示)
    private byte isValid = 0x1;


    public String getMessageId() {
        return basicProperties.getMessageId();
    }
    public void setMessageId(String messageId) {
        basicProperties.setMessageId(messageId);
    }

    public String getRoutingKey() {
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey(String routingKey) {
        basicProperties.setRoutingKey(routingKey);
    }

    public int getDeliverMode() {
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(int mode) {
        basicProperties.setDeliverMode(mode);
    }



    //创建一个工厂方法,让工厂方法帮我们封装创建Message对象的过程
    //这个方法创建的Message对象会自动删除唯一的MessageId
    public static Message createMessageWithId(String routingKey, BasicProperties basicProperties, byte[] body) {
        Message message = new Message();
        if (basicProperties != null) {
            message.setBasicProperties(basicProperties);
        }

        message.basicProperties.setMessageId("M-" + UUID.randomUUID());//生成MessageId,M为前缀
        message.basicProperties.setRoutingKey(routingKey);
        message.body = body;
        //offsetBeg,offsetEnd,isValid等到持久化的时候才设置值

        return message;
    }


    public BasicProperties getBasicProperties() {
        return basicProperties;
    }

    public void setBasicProperties(BasicProperties basicProperties) {
        this.basicProperties = basicProperties;
    }

    public byte getIsValid() {
        return isValid;
    }

    public void setIsValid(byte isValid) {
        this.isValid = isValid;
    }

    public long getOffsetEnd() {
        return offsetEnd;
    }

    public void setOffsetEnd(long offsetEnd) {
        this.offsetEnd = offsetEnd;
    }

    public long getOffsetBeg() {
        return offsetBeg;
    }

    public void setOffsetBeg(long offsetBeg) {
        this.offsetBeg = offsetBeg;
    }

    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }

    @Override
    public String toString() {
        return "Message{" +
                "basicProperties=" + basicProperties +
                ", body=" + Arrays.toString(body) +
                ", offsetBeg=" + offsetBeg +
                ", offsetEnd=" + offsetEnd +
                ", isValid=" + isValid +
                '}';
    }
}
